package com.solidario.wrapping;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import sifeap.wrappers.asociados.VinculadoWrapper;
import sifeap.wrappers.creditos.CreditoWrapper;
import sifeap.wrappers.creditos.TipoCreditoWrapper;

import com.solidario.accesodatos.impl.CreditoAccesoDatos;
import com.solidario.accesodatos.impl.TipoCreditoAccesoDatos;
import com.solidario.entidades.Credito;
import com.solidario.entidades.TipoCredito;

/**
 * Clase para llenar el Wrapper de Aportes
 *
 */
public class CreditoWrapping {
	private CreditoAccesoDatos creditoDatos;
	private TipoCreditoAccesoDatos tipoCreditoDatos;
	
	public CreditoWrapping() {
		creditoDatos = new CreditoAccesoDatos();
		tipoCreditoDatos = new TipoCreditoAccesoDatos();
	}
	
	/**
	 * Metodo para obtener un Wrapper de la deuda total por cedula
	 * @param cedula
	 * @return Retorna la informacion en un Wrapper. Retorna <code>null</code> si el vinculado no existe.
	 */
	public Double totalDeuda(String cedula) {
		Double total = null;
        
		try {
			total = creditoDatos.totalDeuda(cedula);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
    	
    	if (total == null)
    		return null;

		return total;
	}
	
	public List<CreditoWrapper> obtenerCreditos(String cedula, Date fechaInicio, Date fechaFin) {
		List<CreditoWrapper> listaCreditosWp;
		List<Credito> listaCreditos;
		
		try {
			listaCreditos = creditoDatos.creditosVinculado(cedula, fechaInicio, fechaFin);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
    	if (!(listaCreditos != null && listaCreditos.size() > 0))
    		return null;
   
		//Se recorre la lista y se mapea con los wrappers
    	CreditoWrapper creditoWp;
    	TipoCreditoWrapper tipoCreditoWp;
    	listaCreditosWp = new ArrayList<CreditoWrapper>();
    	for (Credito credito : listaCreditos) {
			creditoWp = new CreditoWrapper();
			creditoWp.setIdCredito(credito.getIdCredito());
			creditoWp.setCedula(credito.getVinculado().getVincedula());
			creditoWp.setCuotasPagadas(credito.getCuotasPagadas());
			creditoWp.setFecha(credito.getFecha());
			creditoWp.setInteres(credito.getInteres());
			creditoWp.setMontoPrestado(credito.getMontoPrestado());
			creditoWp.setNumeroCuotas(credito.getNumeroCuotas());
			creditoWp.setSaldo(credito.getSaldo());
			creditoWp.setSeguro(credito.getSeguro());
			creditoWp.setValorCuota(credito.getValorCuota());
			
			try {
				creditoWp.setInteresCuota((creditoWp.getValorCuota() * creditoWp.getInteres()) / 100);
				creditoWp.setAbonoCapital(creditoWp.getValorCuota() * creditoWp.getCuotasPagadas());
			} catch (Exception e) {}
			
			tipoCreditoWp = new TipoCreditoWrapper();
			tipoCreditoWp.setTipoCredito(credito.getTiposcredito().getIdTipoCredito());
			tipoCreditoWp.setNombre(credito.getTiposcredito().getNombre());
			creditoWp.setTipoCredito(tipoCreditoWp);
			
			listaCreditosWp.add(creditoWp);
		}
		
		return listaCreditosWp;
	}
	
	public TipoCreditoWrapper obtenerTipoCredito(String id) {
        TipoCreditoWrapper tipoCreditoWp = null;
        
    	TipoCredito tipoCredito = tipoCreditoDatos.buscar(id);
    	
    	if (tipoCredito == null)
    		return null;
   
		//Se utiliza en Wrapper para capturar todos los datos del tipo de credito
    	tipoCreditoWp = new TipoCreditoWrapper();
    	tipoCreditoWp.setTipoCredito(tipoCredito.getIdTipoCredito());
    	tipoCreditoWp.setNombre(tipoCredito.getNombre());
    	tipoCreditoWp.setInteres(tipoCredito.getInteres());
    	tipoCreditoWp.setSeguro(tipoCredito.getSeguro());
    	
		return tipoCreditoWp;
	}
	
	public List<CreditoWrapper> obtenerCreditosPorTipo(String idTipoCredito, Date fechaInicio, Date fechaFin) {
		List<CreditoWrapper> listaCreditosWp;
		List<Credito> listaCreditos;
		
		try {
			listaCreditos = creditoDatos.creditosPorTipo(idTipoCredito, fechaInicio, fechaFin);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
    	if (!(listaCreditos != null && listaCreditos.size() > 0))
    		return null;
   
		//Se recorre la lista y se mapea con los wrappers
    	CreditoWrapper creditoWp;
    	TipoCreditoWrapper tipoCreditoWp;
    	VinculadoWrapper vinculado;
    	
    	listaCreditosWp = new ArrayList<CreditoWrapper>();
    	for (Credito credito : listaCreditos) {
			creditoWp = new CreditoWrapper();
			creditoWp.setIdCredito(credito.getIdCredito());
			creditoWp.setCedula(credito.getVinculado().getVincedula());
			creditoWp.setCuotasPagadas(credito.getCuotasPagadas());
			creditoWp.setFecha(credito.getFecha());
			creditoWp.setInteres(credito.getInteres());
			creditoWp.setMontoPrestado(credito.getMontoPrestado());
			creditoWp.setNumeroCuotas(credito.getNumeroCuotas());
			creditoWp.setSaldo(credito.getSaldo());
			creditoWp.setSeguro(credito.getSeguro());
			creditoWp.setValorCuota(credito.getValorCuota());
			
			try {
				creditoWp.setInteresCuota((creditoWp.getValorCuota() * creditoWp.getInteres()) / 100);
				creditoWp.setAbonoCapital(creditoWp.getValorCuota() * creditoWp.getCuotasPagadas());
			} catch (Exception e) {}
			
			tipoCreditoWp = new TipoCreditoWrapper();
			tipoCreditoWp.setTipoCredito(credito.getTiposcredito().getIdTipoCredito());
			tipoCreditoWp.setNombre(credito.getTiposcredito().getNombre());
			creditoWp.setTipoCredito(tipoCreditoWp);
			
			//Asociado
			try {
				vinculado = new VinculadoWrapping().obtenerPorCedula(credito.getVinculado().getVincedula());
				creditoWp.setVinculado(vinculado);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			listaCreditosWp.add(creditoWp);
		}
		
		return listaCreditosWp;
	}
}
